#include <vector>
#include <list>
#include <string>
#include <iostream>
#include "../resources/Sales_data.h"

using namespace std;

int main()
{
    vector<string> svec;
    list<string> slist;

    // 等价于调用 slist.push_front("Hello!");
    slist.insert(slist.begin(), "Hello!");  // 将 "Hello!" 添加到 iter 之前的位置

    // vector 不支持 push_front，但我们可以插入到 begin() 之前
    // 警告：插入到 vector 末尾之外的任何位置都可能很慢
    svec.insert(svec.begin(), "Hello!");
    // 将 10 个元素（"Anna"）插入到 svec 的末尾
    svec.insert(svec.end(), 10, "Anna");

    vector<string> v = {"quasi", "simba", "frollo", "scar"};
    // 将 v 的最后两个元素添加到 slist 的开始位置
    slist.insert(slist.begin(), v.end() - 2, v.end());
    slist.insert(slist.end(), {"these", "word", "will", 
                                "go", "at", "the", "end"});
    // 运行时错误：迭代器表示要拷贝的范围，不能指向与目的位置相同的容器
    slist.insert(slist.begin(), slist.begin(), slist.end());

    list<string> lst;
    auto iter = lst.begin();
    string word;
    while (cin >> word)
        // insert 返回的迭代器指向插入的新元素
        iter = lst.insert(iter, word); // 等价于调用 push_front

    list<Sales_data> c;
    // 在 c 的末尾构造一个 Sales_data 对象
    // 使用三个参数的 Sales_data 构造函数
    c.emplace_back("978-0590353403", 25, 15.99);
    // 错误：没有接受三个参数的 push_back 版本
    // c.push_back("978-0590353403", 25, 15.99);
    // 正确：创建一个临时的 Sales_data 对象传递给 push_back
    c.push_back(Sales_data("978-0590353403", 25, 15.99));

    auto c_iter = c.begin();
    // c_iter 指向 c 中一个元素，其中保存了 Sales_data 元素
    c.emplace_back(); // 使用 Sales_data 的默认构造函数
    c.emplace(c_iter, "999-999999999"); // 使用 Sales_data(string)
    // 使用 Sales_data 的接受一个 ISBN、一个 count 和一个 price 的构造函数
    c.emplace_front("978-0590353403", 25, 15.99);
}